//
//  TemplateExercise.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/24.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef TemplateExercise_hpp
#define TemplateExercise_hpp

#include <stdio.h>
#include <iostream>
#include <string>

template <class T1,class T2>
class Pair1 {
protected:
    T1 m_first;
    T2 m_second;
    
public:
    
    Pair1(T1 value1,T2 value2);
    
    T1 &first();
    
    T2 &second();
    
};

//拆分模板类定义和成员函数定义不能像普通类一样工作 - 您不能将类定义放入.cpp文件中的头和成员函数定义中。通常最好将它们全部保存在头文件中，将成员函数定义放在类的下面。
template <class T1,class T2>
Pair1<T1,T2>::Pair1(T1 value1,T2 value2):m_first(value1),m_second(value2){
    
}

template <class T1,class T2>
T1 &Pair1<T1,T2>::first(){
    return m_first;
}

template <class T1,class T2>
T2 &Pair1<T1,T2>::second(){
    return m_second;
}

template <class T2>
class StringValuePair : public Pair1<std::string, T2> {
    
    
public:
    
    StringValuePair(const std::string &key,const T2 &value):Pair1<std::string,T2>(key,value){
//        Pair1<std::string,T2>
//        this->m_first = "alex";
        
        //子类无法访问基类的成员变量或成员函数
        //用this访问即可，也可以直接在成员前家基类的名字Base<T>::
        
        Pair1<std::string, T2>::m_first;
        this->m_first;
        
        
    }
    
};

#endif /* TemplateExercise_hpp */
